package com.ranyk.www.base;

import com.ranyk.www.security.AuthorizingUser;
import com.ranyk.www.util.SingletonLoginUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.text.StringEscapeUtils;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;

import java.beans.PropertyEditorSupport;

/**
 * CLASS_NAME: BaseController.java <br/>
 *
 * @author ranyk           <br/>
 * @version V1.0           <br/>
 * @decription: 基础 Controller 类  <br/>
 * @date: 2022-04-01 <br/>
 */
@Slf4j
@SuppressWarnings("unused")
public class BaseController {

    /**
     * 前端数据传入前对其进行特殊字符转为转移字符处理
     *
     * @param binder {@link  WebDataBinder} 对象
     */
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
            /**
             *  字符串解析,将前端穿过来的特殊字符使用转义字符替换,防止 XSS 攻击
             * @param text  The string to be parsed. 需要被解析的字符串
             */
            @Override
            public void setAsText(String text) {
                setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
            }

            @Override
            public String getAsText() {
                Object value = getValue();
                return value != null ? value.toString() : "";
            }
        });
    }

    /**
     * 地址重定向方法,在所以需要重定向的地址前加 redirect: 字符串
     *
     * @param url 需要重定向的地址
     * @return 返回 redirect:+url 字符串
     */
    protected String redirectTo(String url) {
        return "redirect:" + url;
    }

    /**
     * 获取当前登录用户ID
     *
     * @return 返回用户ID, 如果没有获取到用户则返回 0;
     */
    protected long getCurrentUserId() {
        if (null == getCurrentUser()) {
            return 0L;
        } else {
            return getCurrentUser().getUserId();
        }
    }

    /**
     * 获取当前登录用户
     *
     * @return 返回获取到的用户对象, 参见 {@link AuthorizingUser} ; 如果没有查询到用户则返回 null;
     */
    protected AuthorizingUser getCurrentUser() {
        return SingletonLoginUtils.getUser();
    }

}
